/**
 * 事件监听对象
 */
interface List {
    [key: string]: Array<CallableFunction>;
}
class Dispense {
    private __list: List = {};
    /**
     * 构造函数
     * 事件管理器
     * @memberof Event
     */
    constructor() {
        this.__list = {}
    }
    /**
     * 有没有指定类型的事件正在监听
     * @param {string} type 事件类型
     */
    hasType(type: string): boolean {
        if (Object.prototype.hasOwnProperty.call(this.__list, type) && this.__list[type].length > 0) {
            return true
        }
        return false
    }
    /**
     * 绑定事件
     *
     * @param {string} type 事件类型
     * @param {function} fn 回调函数
     * @memberof EventTarget
     */
    on(type: string, fn: CallableFunction): void {
        if (!Object.prototype.hasOwnProperty.call(this.__list, type)) {
            this.__list[type] = []
        }
        this.__list[type].push(fn)
    }
    one(type: string, fn: CallableFunction) {
        const a = (...arg: any) => {
            this.off(type, a)
            fn(...arg)
        }
        this.on(type, a)
    }
    /**
     *触发指定的事件
     *
     * @param {string} type 事件类型
     * @param {function} event 回调的参数
     * @memberof EventTarget
     */
    trigger(type: string, ...arg: any[]) {
        if (Object.prototype.hasOwnProperty.call(this.__list, type)) {
            this.__list[type].map((val) => {
                val(...arg)
                // val.call(this, ...arg);
            })
        }
    }
    /**
     * 清除指定的事件
     *
     * @param {string} type 事件类型
     * @param {function} fn 回调函数
     * @memberof EventTarget
     */
    off(type: string, fn?: CallableFunction) {
        if (!fn) {
            if (Object.prototype.hasOwnProperty.call(this.__list, type)) {
                this.__list[type] = []
            }
        } else {
            if (Object.prototype.hasOwnProperty.call(this.__list, type)) {
                this.__list[type] = this.__list[type].filter((val) => {
                    return val !== fn
                })
            }
        }
    }
}
export default Dispense
